package cn.lili.controller.feign;

import cn.hutool.core.util.ClassLoaderUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.lili.modules.goods.client.GoodsIndexClient;
import cn.lili.modules.goods.entity.dos.Goods;
import cn.lili.modules.promotion.entity.dos.BaseStandardPromotions;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import cn.lili.modules.search.entity.dto.EsDeleteDTO;
import cn.lili.modules.search.entity.dto.EsGoodsIndexDTO;
import cn.lili.modules.search.entity.dto.EsGoodsIndexUpdateDTO;
import cn.lili.modules.search.entity.dto.EsGoodsIndexUpdatePromotionsDTO;
import cn.lili.modules.search.service.EsGoodsIndexService;
import cn.lili.modules.search.service.EsGoodsSearchService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author paulG
 * @since 2022/6/20
 **/
@RestController
@RequiredArgsConstructor
public class GoodsIndexFeignController implements GoodsIndexClient {

    private static final String PROMOTIONS_KEY = "promotions";
    private static final String PROMOTIONS_TYPE_KEY = "promotionsType";
    private static final String PROMOTIONS_UNION_KEY = "esPromotionKey";

    /**
     * 商品索引
     */
    private final EsGoodsIndexService goodsIndexService;

    private final EsGoodsSearchService esGoodsSearchService;

    @Override
    public List<EsGoodsIndex> getEsGoodsBySkuIds(List<String> skuIds) {
        return esGoodsSearchService.getEsGoodsBySkuIds(skuIds);
    }

    /**
     * 清除商品索引中无效促销活动
     */
    @Override
    public void cleanEsGoodsIndexInvalidPromotions() {
        goodsIndexService.cleanInvalidPromotion();
    }

    @Override
    public void updateIndexField(EsGoodsIndexUpdateDTO esGoodsIndexUpdateDTO) {
        goodsIndexService.updateIndex(esGoodsIndexUpdateDTO.getQueryFields(), esGoodsIndexUpdateDTO.getUpdateFields());
    }


    @Override
    public void updateBulkIndex(List<EsGoodsIndex> goodsIndices) {
        goodsIndexService.updateBulkIndex(goodsIndices);
    }

    @Override
    public void updateEsGoodsIndexByList(EsGoodsIndexUpdatePromotionsDTO esGoodsIndexUpdatePromotionsDTO) {
        JSONObject jsonObject = JSONUtil.parseObj(esGoodsIndexUpdatePromotionsDTO.getPromotionsJsonStr());
        // 转换为详细的促销信息（注：促销信息必须继承自 BasePromotions，且必须保证派生类存在与sdk包下）
        BaseStandardPromotions promotions = (BaseStandardPromotions) jsonObject.get(PROMOTIONS_KEY,
                ClassLoaderUtil.loadClass(jsonObject.getStr(PROMOTIONS_TYPE_KEY)));
        String esPromotionKey = jsonObject.getStr(PROMOTIONS_UNION_KEY);
        goodsIndexService.updateEsGoodsIndexByList(esGoodsIndexUpdatePromotionsDTO.getPromotionGoodsList(), promotions, esPromotionKey);
    }

    @Override
    public void updateEsGoodsIndexPromotions(EsGoodsIndexUpdatePromotionsDTO esGoodsIndexUpdatePromotionsDTO) {
        JSONObject jsonObject = JSONUtil.parseObj(esGoodsIndexUpdatePromotionsDTO.getPromotionsJsonStr());
        // 转换为详细的促销信息（注：促销信息必须继承自 BasePromotions，且必须保证派生类存在与sdk包下）
        BaseStandardPromotions promotions = (BaseStandardPromotions) jsonObject.get(PROMOTIONS_KEY,
                ClassLoaderUtil.loadClass(jsonObject.getStr(PROMOTIONS_TYPE_KEY)));
        String esPromotionKey = jsonObject.getStr(PROMOTIONS_UNION_KEY);
        goodsIndexService.updateEsGoodsIndexPromotions(esGoodsIndexUpdatePromotionsDTO.getIds(), promotions, esPromotionKey);
    }

    @Override
    public void updateEsGoodsIndexAllByList(EsGoodsIndexUpdatePromotionsDTO esGoodsIndexUpdatePromotionsDTO) {
        JSONObject jsonObject = JSONUtil.parseObj(esGoodsIndexUpdatePromotionsDTO.getPromotionsJsonStr());
        // 转换为详细的促销信息（注：促销信息必须继承自 BasePromotions，且必须保证派生类存在与sdk包下）
        BaseStandardPromotions promotions = (BaseStandardPromotions) jsonObject.get(PROMOTIONS_KEY,
                ClassLoaderUtil.loadClass(jsonObject.getStr(PROMOTIONS_TYPE_KEY)));
        String esPromotionKey = jsonObject.getStr(PROMOTIONS_UNION_KEY);
        goodsIndexService.updateEsGoodsIndexAllByList(promotions, esPromotionKey);
    }

    @Override
    public EsGoodsIndex findById(String id) {
        return goodsIndexService.findEsGoodsIndexById(id);
    }


    @Override
    public EsGoodsIndex getEsGoodsBySkuId(String skuId) {
        return goodsIndexService.createTempData(skuId);
    }


    @Override
    public void deleteEsGoodsPromotionByPromotionKey(List<String> skuIds, String promotionsKey) {
        goodsIndexService.deleteEsGoodsPromotionByPromotionKey(skuIds, promotionsKey);
    }

    @Override
    public void deleteEsGoodsPromotionByPromotionKey(String promotionsKey) {
        goodsIndexService.deleteEsGoodsPromotionByPromotionKey(promotionsKey);
    }

    @Override
    public void addIndex(EsGoodsIndex goodsIndex) {
        goodsIndexService.addIndex(goodsIndex);
    }

    @Override
    public void addIndex(List<EsGoodsIndex> goodsIndexDTOList) {
        goodsIndexService.addIndex(goodsIndexDTOList);
    }

    @Override
    public void updateGoodsIndexByGoodsList(List<Goods> goodsList) {
        goodsIndexService.updateGoodsIndexByGoodsList(goodsList);
    }

    @Override
    public void updateGoodsIndexByStore(String storeId) {
        goodsIndexService.updateGoodsIndexByStore(storeId);
    }

    @Override
    public void deleteIndex(EsDeleteDTO esDeleteDTO) {
        goodsIndexService.deleteIndex(esDeleteDTO);
    }

    @Override
    public void updateIndex(EsGoodsIndexDTO goodsIndex) {
        goodsIndexService.updateIndex(goodsIndex);
    }
}
